home *** CD-ROM | disk | FTP | other *** search
- #include <ode.h>
- ODESolver:: ODESolver (ODESolverUDC& f)
- : eqdef(f) // f, or eqdef as in <ode.h>, is just a dummy name
- { init(); } // initializations performed in init
-
- void ODESolver:: init ()
- { scratch1.redim (eqdef.size()); }
-
- ForwardEulerODE:: ForwardEulerODE (ODESolverUDC& eqdef)
- : ODESolver (eqdef) {}
-
- void ForwardEulerODE:: advance (Vec(real)& y, real& t, real& dt)
- {
- eqdef.equation (scratch1, y, t);
- for (int i = 1; i <= y.size(); i++)
- y(i) += dt * scratch1(i);
- t += dt;
- }
-
- RungeKutta4ODE:: RungeKutta4ODE (ODESolverUDC& eqdef)
- : ODESolver (eqdef), scratch2(eqdef.size()), scratch3(eqdef.size()) {}
-
- void RungeKutta4ODE:: advance (Vec(real)& y, real& t, real& dt)
- {
- real dt2 = 0.5*dt;
- real dt6 = dt/6.0;
- eqdef.equation (scratch1, y, t);
- for (int i = 1; i <= y.size(); i++)
- scratch2(i) = y(i) + dt2 * scratch1(i);
- eqdef.equation (scratch1, scratch2, t+dt2);
- for (i = 1; i <= y.size(); i++)
- scratch2(i) = y(i) + dt2 * scratch1(i);
- eqdef.equation (scratch3, scratch2, t+dt2);
- for (i = 1; i <= y.size(); i++)
- {
- scratch2(i) = y(i) + dt * scratch3(i);
- scratch3(i) = scratch1(i) + scratch3(i);
- }
- eqdef.equation (scratch1, scratch2, t+dt);
- eqdef.equation (scratch2, y, t);
-
- for (i = 1; i <= y.size(); i++)
- y(i) = y(i) + dt6 * ( scratch1(i) + scratch2(i) + 2*scratch3(i) );
- t += dt;
- }
-
- void Oscillator:: equation (Vec(real)& f, const Vec(real)& y, real t)
- {
- f(1) = y(2);
- f(2) = -c1*(y(2)+c2*y(2)*abs(y(2)))-c3*(y(1)+c4*pow3(y(1))) + sin (omega*t);
- }
-
- void Oscillator:: scan (Is is)
- {
- // reades c1, c2, c3, c4 and omega:
- is >> c1 >> c2 >> c3 >> c4 >> omega;
- s_o << "\nHere are the Oscillator parameters:\n c1=" << c1 << " c2=";
- s_o << c2 << " c3=" << c3 << " c4=" << c4 << " omega=" << omega << '\n';
- }
-
- void Oscillator:: print (Os os)
- {
- os << aform("d^2y/dt^2 + %g*(dy/dt + %g*dy/dt*|dy/dt|) + %g*(y + %g*y^3) \
- = sin(%g*t)\n",c1,c2,c3,c4,omega);
- }
-
-